/*
BASE64的加密解密是双向的，可以求反解.
BASE64Encoder和BASE64Decoder是非官方JDK实现类。虽然可以在JDK里能找到并使用，但是在API里查不到。
JRE 中 sun 和 com.sun 开头包的类都是未被文档化的，他们属于 java, javax 类库的基础，其中的实现大多数与底层平台有关，
一般来说是不推荐使用的。 
BASE64 严格地说，属于编码格式，而非加密算法 
主要就是BASE64Encoder、BASE64Decoder两个类，我们只需要知道使用对应的方法即可。
另，BASE加密后产生的字节位数是8的倍数，如果不够位数以=符号填充。 
BASE64 
按照RFC2045的定义，Base64被定义为：Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。
（The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.） 
常见于邮件、http加密，截取http信息，你就会发现登录操作的用户名、密码字段通过BASE64加密的。
*/

/*
MD5(Message Digest algorithm 5，信息摘要算法) 
通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把，
得到相应的字符串
Digest:汇编
*/

/*
SHA
安全哈希算法（Secure Hash Algorithm）主要适用于数字签名标准（Digital Signature Standard DSS）里面定义的数字签名算法（Digital Signature Algorithm DSA）。
对于长度小于2^64位的消息，SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善，并被广泛使用。
该算法的思想是接收一段明文，然后以一种不可逆的方式将它转换成一段（通常更小）密文，
也可以简单的理解为取一串输入码（称为预映射或信息），并把它们转化为长度较短、
位数固定的输出序列即散列值（也称为信息摘要或信息认证代码）的过程。
散列函数值可以说是对明文的一种"指纹"或是"摘要"所以对散列值的数字签名就可以视为对此明文的数字签名
SHA(Secure Hash Algorithm，安全散列算法），数字签名等密码学应用中重要的工具，
被广泛地应用于电子商务等信息安全领域。虽然，SHA与MD5通过碰撞法都被破解了， 
但是SHA仍然是公认的安全加密算法，较之MD5更为安全
 */

/*
HMAC 
HMAC(Hash Message Authentication Code，散列消息鉴别码，基于密钥的Hash算法的认证协议。
消息鉴别码实现鉴别的原理是，用公开函数和密钥产生一个固定长度的值作为认证标识，用这个标识鉴别消息的完整性。
使用一个密钥生成一个固定大小的小数据块，
即MAC，并将其加入到消息中，然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。
*/
package util.encryption;

import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
 * 
 * 加密
 * @author hxl
 * 2018年11月23日
 */
public class Encryption{
	/**
	 * BASE64解密 
	 * @param key
	 * @return
	 */
	public static byte[] decryptBASE64(String key) throws IOException {
		return (new BASE64Decoder()).decodeBuffer(key);
	}
	/**
	 * BASE64加密
	 * @param key
	 * @return
	 */
	public static String encryptBASE64(byte[] key) {
		return (new BASE64Encoder()).encodeBuffer(key);
	}
	/**
	 * MD5加密
	 * @param key
	 * @return
	 */
	public static String MD5Encrypt(String key) {
		BigInteger bigInteger=null;
		byte[] inputData = key.getBytes(); 
        try {
         MessageDigest messageDigest = MessageDigest.getInstance("MD5");   
         messageDigest.update(inputData);   
         bigInteger = new BigInteger(messageDigest.digest());   
        } catch (Exception e){
           e.printStackTrace();
        }
        return bigInteger.toString(16);
	}
	/**
	 * SHA加密
	 * @param key
	 * @return
	 */
	public static String SHAEncrypt(String key) {
		BigInteger sha =null;
        byte[] inputData = key.getBytes();   
        try {
             MessageDigest messageDigest = MessageDigest.getInstance("SHA");  
             messageDigest.update(inputData);
             sha = new BigInteger(messageDigest.digest());   
        } catch (Exception e){
        	e.printStackTrace();
        }
        return sha.toString(32);
	}
	/**
	 * HMAC加密
	 * @param key
	 * @return
	 */
	public static String HMACEncrypt(String key) {
		return null;
	}
	public static void main(String[] args){
		System.out.println(MD5Encrypt("123456"));
	}

}
